// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Search the bookmarks when entering the search keyword.
$(function() {
    $('#search')
        .change(function() {
        $('#bookmarks')
            .empty();
        dumpBookmarks($('#search')
            .val());
    });
});
// Traverse the bookmark tree, and print the folder and nodes.
function dumpBookmarks(query) {
    var bookmarkTreeNodes = chrome.bookmarks.getTree(

    function(bookmarkTreeNodes) {
        $('#bookmarks')
            .append(dumpTreeNodes(bookmarkTreeNodes, query));
    });
}

function dumpTreeNodes(bookmarkNodes, query) {
    var list = $('<ul>');
    var i;
    for (i = 0; i < bookmarkNodes.length; i++) {
        list.append(dumpNode(bookmarkNodes[i], query));
    }
    return list;
}

function dumpNode(bookmarkNode, query) {
    if (bookmarkNode.title) {
        if (query && !bookmarkNode.children) {
            if (String(bookmarkNode.title)
                .indexOf(query) == -1) {
                return $('<span></span>');
            }
        }
        var anchor = $('<a>');
        anchor.attr('href', bookmarkNode.url);
        anchor.text(bookmarkNode.title);
        /*
         * When clicking on a bookmark in the extension, a new tab is fired with
         * the bookmark url.
         */
        anchor.click(function() {
            chrome.tabs.create({
                url: bookmarkNode.url
            });
        });
        var span = $('<span>');
        var options = bookmarkNode.children ? $('<span>[<a href="#" id="addlink">Add</a>]</span>') : $('<span>[<a id="editlink" href="#">Edit</a> <a id="deletelink" ' + 'href="#">Delete</a>]</span>');
        var edit = bookmarkNode.children ? $('<table><tr><td>Name</td><td>' + '<input id="title"></td></tr><tr><td>URL</td><td><input id="url">' + '</td></tr></table>') : $('<input>');
        // Show add and edit links when hover over.
        span.hover(function() {
            span.append(options);
            $('#deletelink')
                .click(function() {
                $('#deletedialog')
                    .empty()
                    .dialog({
                    autoOpen: false,
                    title: 'Confirm Deletion',
                    resizable: false,
                    height: 140,
                    modal: true,
                    overlay: {
                        backgroundColor: '#000',
                        opacity: 0.5
                    },
                    buttons: {
                        'Yes, Delete It!': function() {
                            chrome.bookmarks.remove(String(bookmarkNode.id));
                            span.parent()
                                .remove();
                            $(this)
                                .dialog('destroy');
                        },
                        Cancel: function() {
                            $(this)
                                .dialog('destroy');
                        }
                    }
                })
                    .dialog('open');
            });
            $('#addlink')
                .click(function() {
                $('#adddialog')
                    .empty()
                    .append(edit)
                    .dialog({
                    autoOpen: false,
                    closeOnEscape: true,
                    title: 'Add New Bookmark',
                    modal: true,
                    buttons: {
                        'Add': function() {
                            chrome.bookmarks.create({
                                parentId: bookmarkNode.id,
                                title: $('#title')
                                    .val(),
                                url: $('#url')
                                    .val()
                            });
                            $('#bookmarks')
                                .empty();
                            $(this)
                                .dialog('destroy');
                            window.dumpBookmarks();
                        },
                        'Cancel': function() {
                            $(this)
                                .dialog('destroy');
                        }
                    }
                })
                    .dialog('open');
            });
            $('#editlink')
                .click(function() {
                edit.val(anchor.text());
                $('#editdialog')
                    .empty()
                    .append(edit)
                    .dialog({
                    autoOpen: false,
                    closeOnEscape: true,
                    title: 'Edit Title',
                    modal: true,
                    show: 'slide',
                    buttons: {
                        'Save': function() {
                            chrome.bookmarks.update(String(bookmarkNode.id), {
                                title: edit.val()
                            });
                            anchor.text(edit.val());
                            options.show();
                            $(this)
                                .dialog('destroy');
                        },
                        'Cancel': function() {
                            $(this)
                                .dialog('destroy');
                        }
                    }
                })
                    .dialog('open');
            });
            options.fadeIn();
        },
        // unhover
        function() {
            options.remove();
        })
            .append(anchor);
    }
    var li = $(bookmarkNode.title ? '<li>' : '<div>')
        .append(span);
    if (bookmarkNode.children && bookmarkNode.children.length > 0) {
        li.append(dumpTreeNodes(bookmarkNode.children, query));
    }
    return li;
}

document.addEventListener('DOMContentLoaded', function() {
    dumpBookmarks();
});